package org.wisdom.ac.domain.role.repository;

import org.springframework.data.domain.*;
import org.springframework.data.jpa.repository.EntityGraph;
import org.wisdom.ac.domain.role.entity.AcRole;
import org.wisdom.data.jpa.repository.WisdomRepository;

import java.util.List;

/**
 * 系统角色仓储
 *
 * @author 张智研
 * @date 2022/05/30 14:25
 **/
@SuppressWarnings("NullableProblems")
public interface RoleRepository extends WisdomRepository<AcRole, String> {
    /**
     * 重写方法，解决N+1问题
     *
     * @author 张智研
     * @date 2022/06/02 12:37
     * @param example 查询条件
     * @return java.util.List<S>
     */
    @Override
    @EntityGraph(value = "roleWithResource", type = EntityGraph.EntityGraphType.FETCH)
    <S extends AcRole> List<S> findAll(Example<S> example);

    /**
     * 查询成员列表
     *
     * @author 张智研
     * @date 2022/05/20 08:49
     * @param role
     *            查询成员条件
     * @param page
     *            页码
     * @param size
     *            大小
     * @param sort
     *            排序
     * @return org.springframework.data.domain.Page<org.wisdom.ab.domain.entity.AbStaff>
     */
    default Page<AcRole> findAll(AcRole role, int page, int size, Sort sort) {
        ExampleMatcher matcher =
                ExampleMatcher.matching().withMatcher("code", ExampleMatcher.GenericPropertyMatcher::startsWith)
                        .withMatcher("name", ExampleMatcher.GenericPropertyMatchers.contains());
        Example<AcRole> roleExample = Example.of(role, matcher);
        return findAll(roleExample, PageRequest.of(page, size, sort));
    }

    /**
     * 查询成员列表
     *
     * @author 张智研
     * @date 2022/05/20 08:49
     * @param role
     *            系统角色
     * @param page
     *            页码
     * @param size
     *            条数
     * @return org.springframework.data.domain.Page<org.wisdom.ab.domain.entity.AbStaff>
     */
    default Page<AcRole> findAll(AcRole role, int page, int size) {
        return findAll(role, page, size, Sort.unsorted());
    }
}
